package com.algo.pattern.sharding;

import net.sf.cglib.beans.BeanCopier;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 基于享元模式与BeanCopier实现Bean拷贝的工具类
 */
public class BeanCopierUtil {
    /**
     * 基于享元模式的思想，将bean转换之间的BeanCopier缓存起来
     */
    private static Map<String, BeanCopier> beanCopierCacheMap = new HashMap<>();

    /**
     * bean拷贝方法
     * @param source 元数据对象
     * @param target 目标对象
     */
    public static void copy(Object source, Object target) {
        String cacheKey = source.getClass().toString() + target.getClass().toString();
        BeanCopier beanCopier = null;

        if ((beanCopier = beanCopierCacheMap.get(cacheKey)) == null) {
            synchronized (beanCopierCacheMap) {
                if (!beanCopierCacheMap.containsKey(cacheKey)) {
                    beanCopier = BeanCopier.create(source.getClass(), target.getClass(), false);
                    beanCopierCacheMap.put(cacheKey, beanCopier);
                }
            }
        }
        beanCopier.copy(source, target, null);
    }

    public static void main(String[] args) {
        List list = null;
        for (Object o : list) {
            System.out.println(o);
        }
    }

}
